/*
 * The contents of this web application are subject to the Mozilla Public License Version 
 * 1.1 (the "License"); you may not use this web application except in compliance with 
 * the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/.
 * 
 * Software distributed under the License is distributed on an "AS IS" basis, 
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
 * for the specific language governing rights and limitations under the License.
 * 
 * The Original Code is owned by and the Initial Developer of the Original Code is 
 * Composite A/S (Danish business reg.no. 21744409). All Rights Reserved
 * 
 * Section 11 of the License is EXPRESSLY amended to include a provision stating 
 * that any dispute, including but not limited to disputes related to the enforcement 
 * of the License, to which Composite A/S as owner of the Original Code, as Initial 
 * Developer or in any other role, becomes a part to shall be governed by Danish law 
 * and be initiated before the Copenhagen City Court ("K�benhavns Byret")            
 */

using System;
using System.Collections.Specialized;
using System.IO;
using System.Net;
using System.Text;
using System.Web.Script.Serialization;


namespace Composite.Social.Instagram
{
    public class ApiBase
    {
        protected static ICache Cache;
        protected static readonly object Threadlock = new object();
        protected static JavaScriptSerializer Serializer = new JavaScriptSerializer();

        public static T DeserializeObject<T>(string json)
        {
            return Serializer.ConvertToType<T>(Serializer.DeserializeObject(json));
        }

        public static string SerializeObject(object value)
        {
            return Serializer.Serialize(value);
        }

        public string RequestPostToUrl(string url, NameValueCollection postData, WebProxy proxy)
        {
            if (string.IsNullOrEmpty(url))
                return null;

            if (url.IndexOf("://", StringComparison.Ordinal) <= 0)
                url = "http://" + url.Replace(",", ".");


            using (var client = new WebClient())
            {
                if (proxy != null)
                    client.Proxy = proxy;

                var response = client.UploadValues(url, postData);
                var enc = new UTF8Encoding();
                var outp = enc.GetString(response);
                return outp;
            }
  
        }

        public string RequestDeleteToUrl(string url, WebProxy proxy)
        {
            if (string.IsNullOrEmpty(url))
                return null;

            if (url.IndexOf("://", StringComparison.Ordinal) <= 0)
                url = "http://" + url.Replace(",", ".");


            var request = WebRequest.Create(url);
            if (proxy != null)
                request.Proxy = proxy;
            request.Method = "DELETE";
            var str = "";
            var resp = request.GetResponse();
            var receiveStream = resp.GetResponseStream();
            var encode = Encoding.GetEncoding("utf-8");
            var readStream = new StreamReader(receiveStream, encode);
            var read = new Char[256];
            int count = readStream.Read(read, 0, 256);
            while (count > 0)
            {
                str = str + new String(read, 0, count);
                count = readStream.Read(read, 0, 256);
            }
            readStream.Close();
            receiveStream.Close();
            //out
            return str;

        }

        public string RequestGetToUrl(string url, WebProxy proxy)
        {
            if (string.IsNullOrEmpty(url))
                return null;

            if (url.IndexOf("://", StringComparison.Ordinal) <= 0)
                url = "http://" + url.Replace(",", ".");


            using (var client = new WebClient())
            {
                if (proxy != null)
                    client.Proxy = proxy;
                var response = client.DownloadData(url);
                var enc = new UTF8Encoding();
                var outp = enc.GetString(response);
                return outp;
            }
        }
    }
}
